/**
 * Copyright (C) 2014 Luvina Software Company
 * Common.java, Dec 15, 2014, Nguyen Huu Luan LA11_AM
 *
 */
package net.luvina.manageuser.utils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpSession;

/**
 * Các hàm dùng chung của project.
 * 
 * @author luan
 * 
 */
public class Common {

	/**
	 * Trả về danh sách chuỗi page cần hiền thị ứng với điều kiện tìm kiếm hiện
	 * tại.
	 * 
	 * @param limit
	 *            số lượng user trên một trang.
	 * @param range
	 *            số trang tối đa hiển thị trên màn hình.
	 * @param totalPage
	 *            tổng số trang thực tế.
	 * @param currentPage
	 *            trang hiện tại.
	 * @return danh sách trang phù hợp với các điều kiện tham số đầu vào.
	 */
	public static List<Integer> getListPaging(int limit, int range,
			int totalPage, int currentPage) {
		List<Integer> listPage = new ArrayList<Integer>();
		int currentSection = (int) Math.ceil((double) currentPage / range);
		int minPage = (currentSection * range) - range + 1;
		int maxPage = Math.min(totalPage, (currentSection * range));
		for (int i = minPage; i <= maxPage; i++) {
			listPage.add(i);
		}
		return listPage;
	}

	/**
	 * Lấy ra giá trị offset tương ứng với điều kiện tham số đầu vào.
	 * 
	 * @param currentPage
	 *            trang hiện tại.
	 * @param limit
	 *            số user tối đa trên một trang.
	 * @return chỉ số của user đầu tiên được hiển thị trên trang đó
	 */
	public static int getOffset(int currentPage, int limit) {
		int offset = (currentPage - 1) * limit;
		return offset;
	}

	/**
	 * Lấy ra tổng số trang ứng với điều kiện tham số đầu vào.
	 * 
	 * @param totalRecord
	 *            tổng số user phù hợp với điều kiện tìm kiếm.
	 * @param limit
	 *            số user tối đa được phép hiển thị trên một trang.
	 * @return tổng số trang.
	 */
	public static int getTotalPage(int totalRecord, int limit) {
		int totalPage = (int) Math.ceil((double) totalRecord / limit);
		return totalPage;
	}

	/**
	 * Chuyển đổi 3 tham số int thành một chuỗi năm/tháng/ngày có định dạnh
	 * yyyy/MM/dd.
	 * 
	 * @param year
	 *            năm.
	 * @param month
	 *            tháng.
	 * @param day
	 *            ngày.
	 * @return chuỗi năm/tháng/ngày.
	 */
	public static String convertToString(int year, int month, int day) {
		String strDate = "";
		Calendar calendar = Calendar.getInstance();
		calendar.set(year, month, day);
		Date date = calendar.getTime();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
		strDate = sdf.format(date);
		return strDate;
	}

	/**
	 * Chuyển đổi 3 tham số int thành một đối tượng Date năm/tháng/ngày có định
	 * dạnh yyyy/MM/dd.
	 * 
	 * @param year
	 *            năm.
	 * @param month
	 *            tháng.
	 * @param day
	 *            ngày.
	 * @return đối tượng Date: năm/tháng/ngày.
	 */
	public static Date toDate(int year, int month, int day) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(year, month, day);
		Date date = calendar.getTime();
		return date;
	}

	/**
	 * Convert từ đối tượng Date thành một danh sách có chứa các phần từ
	 * năm/tháng/ngày. list(1) = năm, list(2) = tháng, list(3) = ngày.
	 * 
	 * @param date
	 *            đối tượng date cần convert.
	 * @return danh sách chứa các phần tử năm/tháng/ngày.
	 */
	public static int[] toArrayInteger(Date date) {
		int[] listDate = new int[3];
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		listDate[0] = calendar.get(Calendar.YEAR);
		listDate[1] = calendar.get(Calendar.MONTH);
		listDate[2] = calendar.get(Calendar.DATE);
		return listDate;
	}

	/**
	 * Lấy về danh sách năm.
	 * 
	 * @param startYear
	 *            năm bắt đầu.
	 * @param endYear
	 *            năm kết thúc
	 * @return danh sách năm.
	 */
	public static List<Integer> getListYear(int startYear, int endYear) {
		List<Integer> listYear = new ArrayList<Integer>();
		for (int i = endYear; i >= startYear; i--) {
			listYear.add(i);
		}
		return listYear;
	}

	/**
	 * Lấy về danh sách tháng.
	 * 
	 * @return danh sách các tháng trong năm.
	 */
	public static List<Integer> getListMonth() {
		List<Integer> listMonth = new ArrayList<Integer>();
		for (int i = 1; i <= 12; i++) {
			listMonth.add(i);
		}
		return listMonth;
	}

	/**
	 * Lấy về danh sách ngày trong tháng.
	 * 
	 * @return danh sách các ngày trong tháng.
	 */
	public static List<Integer> getListDay() {
		List<Integer> listDay = new ArrayList<Integer>();
		for (int i = 1; i <= 31; i++) {
			listDay.add(i);
		}
		return listDay;
	}

	/**
	 * Thoát các kí tự HTML đặc biệt.
	 * 
	 * @param content
	 *            Chuỗi có chứa các kí tự HTML.
	 * @return chuỗi đã được thoát các kí tự HTML.
	 */
	public static String escapeHTML(String content) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < content.length(); i++) {
			char c = content.charAt(i);
			switch (c) {
			case '<':
				sb.append("&lt;");
				break;
			case '>':
				sb.append("&gt;");
				break;
			case '&':
				sb.append("&amp;");
				break;
			case '"':
				sb.append("&quot;");
				break;
			default:
				sb.append(c);
			}
		}
		content = sb.toString();
		return content;
	}

	/**
	 * Thoát các chuỗi SQL injection.
	 * 
	 * @param string
	 *            chuỗi với các kí tự sql đặc biệt.
	 * @return chuỗi đã được thoát các kí tự SQL injection.
	 */
	public static String escapeInjection(String content) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < content.length(); i++) {
			char c = content.charAt(i);
			switch (c) {
			case '\\':
				sb.append("\\\\");
				break;
			case '\'':
				sb.append("\\'");
				break;
			case '%':
				sb.append("\\%");
				break;
			case '"':
				sb.append("\\\"");
				break;
			case '_':
				sb.append("\\_");
				break;
			default:
				sb.append(c);
			}
		}
		content = sb.toString();
		return content;
	}

	/**
	 * Kiểm tra xem đã có user nào login vào hay chưa.
	 * 
	 * @param session
	 *            HttpSession
	 * @return ADM001 nếu chưa có user nào login.
	 */
	public static String checkLogin(HttpSession session) {
		String template = "";
		if (session.getAttribute("loginName") == null) {
			template = Constant.ADM001;
		}
		return template;
	}

	/**
	 * Định dạng lại ngày tháng lấy ra từ result set.
	 * 
	 * @param date
	 *            ngày tháng được lấy ra từ ResultSet.
	 * @return chuỗi ngày tháng đã được format lại theo đúng định dạng yêu cầu.
	 */
	public static String formatDate(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(Constant.DATE_FORMAT);
		String string = sdf.format(date);
		return string;
	}

	/**
	 * Trả về giá trị là năm hiện tại.
	 * 
	 * @return năm hiện tại.
	 */
	public static int getNowYear() {
		int nowYear = Calendar.getInstance().get(Calendar.YEAR);
		return nowYear;
	}
}
